home *** CD-ROM | disk | FTP | other *** search
- (* Find all settings of 8 queens on an 8x8 chess board such
- that no queen checks another queen.
- [see also, Comm. ACM 14, 4, 221-27 (April 74)]. *)
-
- MODULE queens;
-
- FROM InOut IMPORT Write, WriteLn, WriteInt;
-
- VAR i: INTEGER;
- a: ARRAY [1..8] OF BOOLEAN;
- b: ARRAY [2..16] OF BOOLEAN;
- c: ARRAY [-7..7] OF BOOLEAN;
- x: ARRAY [1..8] OF INTEGER;
- safe: BOOLEAN;
-
- PROCEDURE print;
- VAR k: INTEGER;
- BEGIN
- Write(' ');
- FOR k:= 1 TO 8 DO WriteInt(x[k],2) END;
- WriteLn
- END print;
-
- PROCEDURE trycol(j: INTEGER);
- VAR i: INTEGER;
-
- PROCEDURE setqueen;
- BEGIN
- a[i] := FALSE;
- b[i+j] := FALSE;
- c[i-j] := FALSE
- END setqueen;
-
- PROCEDURE removequeen;
- BEGIN
- a[i] := TRUE;
- b[i+j] := TRUE;
- c[i-j] := TRUE
- END removequeen;
-
- BEGIN
- i := 0;
- REPEAT
- INC(i);
- safe := a[i] AND b[i+j] AND c[i-j];
- IF safe THEN
- setqueen;
- x[j] := i;
- IF j < 8 THEN trycol(j+1) ELSE print END;
- removequeen
- END
- UNTIL i = 8
- END trycol;
-
- BEGIN
- FOR i := 1 TO 8 DO a[i] := TRUE END;
- FOR i := 2 TO 16 DO b[i] := TRUE END;
- FOR i := -7 TO 7 DO c[i] := TRUE END;
- trycol(1)
- END queens.
-